use bit_struct::bit_struct;

// riscv 的指令长度固定为 32 bit
bit_struct! {
    Instr(u32) {
        op_code: 7
    }
}

// todo: 考虑可以指定特定项的返回值类型，rs1、rs2、rd 类型肯定是 usize, 这里都是返回 u32
bit_struct! {
    InstrS(u32){
      opcode1_0 : 2,
      opcode6_2 : 5,
      imm4_0    : 5,
      funct3    : 3,
      rs1       : 5,
      rs2       : 5,
      simm11_5  : 7
    }
}

bit_struct! {
    InstrI(u32){
       opcode1_0 : 2,
       opcode6_2 : 5,
       rd        : 5,
       funct3    : 3,
       rs1       : 5,
       simm11_0  : 12
    }
}

bit_struct! {
    InstrU(u32){
       opcode1_0 : 2,
       opcode6_2 : 5,
       rd        : 5,
       simm31_12 : 20
    }
}

bit_struct! {
    InstrJ(u32) {
        opcode1_0: 2,
        opcode6_2: 5,
        rd: 5,
        imm12_19: 8,
        imm11: 1,
        imm1_10: 10,
        simm20: 1
    }
}
